/**
 * 
 */
package Core.MultiString;

import java.util.TreeMap;

import API.BitOutputStream;

/**
 * @author SungHun Park (dr.superchamp@gmail.com)
 *
 */
public class HuffmanEncoding {
	private static TreeMap<Byte,TreeMap<Byte,String>> ATSC_C4_encode_map = new TreeMap<Byte,TreeMap<Byte,String>>();
	private static TreeMap<Byte,TreeMap<Byte,String>> ATSC_C6_encode_map = new TreeMap<Byte,TreeMap<Byte,String>>();
	private static boolean bInitialized = false;
	
	/**
	 * initialize Huffman encoding map.
	 */
	private static void init() {
		Byte prior, symbol;
		String code;
		TreeMap<Byte,String> sub_map;
		int loop_len;

		loop_len = ATSC_C4_PRIOR.length;
		for(int n=0; n < loop_len; n++) {
			prior = ATSC_C4_PRIOR[n];
			symbol = ATSC_C4_SYMBOL[n];
			code = ATSC_C4_CODE[n];

			if (ATSC_C4_encode_map.containsKey(prior) == false) {
				sub_map = new TreeMap<Byte,String>();
				ATSC_C4_encode_map.put(prior, sub_map);
			}else {
				sub_map = ATSC_C4_encode_map.get(prior);
			}

			sub_map.put(symbol, code);
		}

		loop_len = ATSC_C6_PRIOR.length;
		for(int n=0; n < loop_len; n++) {
			prior = ATSC_C6_PRIOR[n];
			symbol = ATSC_C6_SYMBOL[n];
			code = ATSC_C6_CODE[n];

			if (ATSC_C6_encode_map.containsKey(prior) == false) {
				sub_map = new TreeMap<Byte,String>();
				ATSC_C6_encode_map.put(prior, sub_map);
			}else {
				sub_map = ATSC_C6_encode_map.get(prior);
			}

			sub_map.put(symbol, code);
		}

		bInitialized = true;
	}
	
	/**
	 * process core encoding work.
	 * @param base_map
	 * @param byte_str
	 * @return
	 */
	private static byte[] encoding(TreeMap<Byte,TreeMap<Byte,String>> base_map, byte[] byte_str) {
		if (byte_str == null || byte_str.length == 0)
			return null;
		
		if (bInitialized == false)
			init();

		BitOutputStream os = new BitOutputStream(byte_str.length*Byte.SIZE* 3/*by default, assume worst case..*/);
		TreeMap<Byte,String> sub_map = base_map.get((Byte)(new Byte((byte)0)));
		Byte symbol;
		String code;
		final Byte escape_symbol = new Byte((byte)27);
		final Byte end_symbol = new Byte((byte)0);

		for(int n=0; n < byte_str.length; n++) {
			symbol = byte_str[n];
			code = sub_map.get(symbol);
			if (code == null) {
				// <In Annex C: Standard Huffman Tables for Text Compression of ATSC_A65>
				// ...
				// 2.1 First Order Escape
				// The order-1 Huffman trees are partial, that is, codes are not defined for every possible character
				// sequence. For example, the standard decode tables do not contain codes for the character
				// sequence qp. When uncompressed text contains a character sequence which is not defined in the
				// decode table, the order-1 escape character is used to escape back to the uncompressed context.
				// Uncompressed symbols are coded as 8-bit ASCII (Latin I). For example, the character sequence
				// qpa would be coded with compressed q, compressed ESC, uncompressed p, compressed a.
				// ...
				// First-order escape rules for compressed strings:
				// 	• Any character which follows a first-order escape character is an uncompressed (8-bit)
				//	character. (Any character which follows an uncompressed escape character is
				//	compressed).
				//	• Characters (128 .. 255) cannot be compressed.
				//	• Any character which follows a character from the set (128 .. 255) is uncompressed.
				code = sub_map.get(escape_symbol);
				os.writeFromLSB(Integer.parseInt(code, 2), code.length());
				os.writeFromLSB(byte_str[n], 8);
			}else {
				os.writeFromLSB(Integer.parseInt(code, 2), code.length());
			}
			sub_map = base_map.get(symbol);
		}
		
		code = sub_map.get(end_symbol);
		if (code == null) {
			code = sub_map.get(escape_symbol);
			os.writeFromLSB(Integer.parseInt(code, 2), code.length());
			os.writeFromLSB(0, 8);
		}else {
			os.writeFromLSB(Integer.parseInt(code, 2), code.length());
		}

		byte result[], temp_bytes[] = os.toByteArray();
		if ((os.getPos() & 0x7) != 0)
			result = new byte[(os.getPos()>>3)+1];
		else
			result = new byte[os.getPos()>>3];
		for(int n=0; n < result.length; n++)
			result[n] = temp_bytes[n];
		
		return result;
	}

	/**
	 * huffman encoding based on the Table C4 of ATSC_A65. (compression_type == 0x01) 
	 * @param char_str
	 * @return
	 */
	public static byte[] encoding_by_ATSC_C4(char[] char_str) {
		if (char_str == null || char_str.length == 0)
			return null;

		byte[] byte_str = new byte[char_str.length];
		for(int n=0; n < byte_str.length; n++)
			byte_str[n] = (byte)char_str[n];

		return encoding(ATSC_C4_encode_map, byte_str);
	}

	/**
	 * huffman encoding based on the Table C4 of ATSC_A65. (compression_type == 0x01)
	 * @param byte_str
	 * @return
	 */
	public static byte[] encoding_by_ATSC_C4(byte[] byte_str) {
		return encoding(ATSC_C4_encode_map, byte_str);
	}

	/**
	 * huffman encoding based on the Table C6 of ATSC_A65. (compression_type == 0x02)
	 * @param char_str
	 * @return
	 */
	public static byte[] encoding_by_ATSC_C6(char[] char_str) {
		if (char_str == null || char_str.length == 0)
			return null;

		byte[] byte_str = new byte[char_str.length];
		for(int n=0; n < byte_str.length; n++)
			byte_str[n] = (byte)char_str[n];

		return encoding(ATSC_C6_encode_map, byte_str);
	}
	
	/**
	 * huffman encoding based on the Table C6 of ATSC_A65. (compression_type == 0x02)
	 * @param byte_str
	 * @return
	 */
	public static byte[] encoding_by_ATSC_C6(byte[] byte_str) {
		return encoding(ATSC_C6_encode_map, byte_str);
	}
	
	/* 
	 * below tables are 'copy-and-pasted' from ATSC_A65, Table C4 and C6.
	 */
	private static final byte[] ATSC_C4_PRIOR = {
		0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
		0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 
		3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 
		19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, ' ', ' ', ' ', 
		' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', 
		' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', 
		' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '!', '!', '!', '\"', '#', '$', '$', 
		'%', '&', '&', '\'', '\'', '\'', '\'', '\'', '\'', '(', ')', '*', '*', '*', '*', '+', 
		',', ',', '-', '-', '-', '-', '-', '-', '-', '-', '-', '-', '.', '.', '.', '.', 
		'.', '.', '.', '/', '0', '0', '0', '0', '0', '1', '1', '1', '1', '1', '1', '1', 
		'2', '2', '2', '2', '2', '3', '3', '3', '4', '4', '5', '6', '7', '7', '8', '8', 
		'9', '9', '9', '9', '9', ':', ':', ';', '<', '=', '>', '?', '?', '@', 'A', 'A', 
		'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 
		'A', 'A', 'A', 'A', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'C', 
		'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'D', 'D', 'D', 
		'D', 'D', 'D', 'D', 'D', 'E', 'E', 'E', 'E', 'E', 'E', 'E', 'E', 'E', 'E', 'E', 
		'E', 'E', 'F', 'F', 'F', 'F', 'F', 'F', 'F', 'F', 'F', 'F', 'G', 'G', 'G', 'G', 
		'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'H', 'H', 'H', 'H', 'H', 'H', 'H', 'I', 
		'I', 'I', 'I', 'I', 'I', 'I', 'I', 'I', 'I', 'I', 'I', 'I', 'J', 'J', 'J', 'J', 
		'J', 'K', 'K', 'K', 'K', 'K', 'K', 'K', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'M', 
		'M', 'M', 'M', 'M', 'M', 'M', 'M', 'M', 'M', 'M', 'N', 'N', 'N', 'N', 'N', 'N', 
		'N', 'N', 'N', 'N', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 
		'P', 'P', 'P', 'P', 'P', 'P', 'P', 'P', 'P', 'P', 'P', 'P', 'P', 'P', 'Q', 'Q', 
		'Q', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'S', 'S', 'S', 'S', 'S', 'S', 'S', 'S', 
		'S', 'S', 'S', 'S', 'S', 'S', 'S', 'S', 'S', 'S', 'S', 'T', 'T', 'T', 'T', 'T', 
		'T', 'T', 'T', 'T', 'T', 'T', 'T', 'U', 'U', 'U', 'U', 'U', 'V', 'V', 'V', 'V', 
		'V', 'V', 'V', 'V', 'W', 'W', 'W', 'W', 'W', 'W', 'W', 'W', 'W', 'X', 'Y', 'Y', 
		'Y', 'Y', 'Z', 'Z', 'Z', '[', '\\', ']', '^', '_', '`', 'a', 'a', 'a', 'a', 'a', 
		'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 
		'a', 'a', 'a', 'a', 'a', 'a', 'a', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 
		'b', 'b', 'b', 'b', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 
		'c', 'c', 'c', 'c', 'c', 'c', 'c', 'd', 'd', 'd', 'd', 'd', 'd', 'd', 'd', 'd', 
		'd', 'd', 'd', 'd', 'd', 'd', 'd', 'd', 'e', 'e', 'e', 'e', 'e', 'e', 'e', 'e', 
		'e', 'e', 'e', 'e', 'e', 'e', 'e', 'e', 'e', 'e', 'e', 'e', 'e', 'e', 'e', 'e', 
		'e', 'e', 'e', 'e', 'e', 'e', 'e', 'e', 'e', 'f', 'f', 'f', 'f', 'f', 'f', 'f', 
		'f', 'f', 'f', 'f', 'f', 'f', 'g', 'g', 'g', 'g', 'g', 'g', 'g', 'g', 'g', 'g', 
		'g', 'g', 'g', 'g', 'g', 'g', 'g', 'g', 'h', 'h', 'h', 'h', 'h', 'h', 'h', 'h', 
		'h', 'h', 'h', 'h', 'h', 'h', 'h', 'i', 'i', 'i', 'i', 'i', 'i', 'i', 'i', 'i', 
		'i', 'i', 'i', 'i', 'i', 'i', 'i', 'i', 'i', 'i', 'i', 'i', 'i', 'i', 'i', 'j', 
		'j', 'j', 'k', 'k', 'k', 'k', 'k', 'k', 'k', 'k', 'k', 'k', 'k', 'k', 'k', 'k', 
		'l', 'l', 'l', 'l', 'l', 'l', 'l', 'l', 'l', 'l', 'l', 'l', 'l', 'l', 'l', 'l', 
		'l', 'l', 'l', 'l', 'l', 'l', 'l', 'l', 'm', 'm', 'm', 'm', 'm', 'm', 'm', 'm', 
		'm', 'm', 'm', 'm', 'm', 'n', 'n', 'n', 'n', 'n', 'n', 'n', 'n', 'n', 'n', 'n', 
		'n', 'n', 'n', 'n', 'n', 'n', 'n', 'n', 'n', 'n', 'n', 'n', 'n', 'n', 'n', 'n', 
		'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 
		'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'p', 'p', 
		'p', 'p', 'p', 'p', 'p', 'p', 'p', 'p', 'p', 'p', 'p', 'p', 'p', 'p', 'p', 'q', 
		'q', 'r', 'r', 'r', 'r', 'r', 'r', 'r', 'r', 'r', 'r', 'r', 'r', 'r', 'r', 'r', 
		'r', 'r', 'r', 'r', 'r', 'r', 'r', 'r', 'r', 'r', 'r', 'r', 's', 's', 's', 's', 
		's', 's', 's', 's', 's', 's', 's', 's', 's', 's', 's', 's', 's', 's', 's', 's', 
		's', 's', 's', 's', 's', 's', 's', 's', 't', 't', 't', 't', 't', 't', 't', 't', 
		't', 't', 't', 't', 't', 't', 't', 't', 't', 't', 't', 't', 't', 't', 't', 'u', 
		'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 
		'u', 'u', 'u', 'v', 'v', 'v', 'v', 'v', 'v', 'w', 'w', 'w', 'w', 'w', 'w', 'w', 
		'w', 'w', 'w', 'w', 'w', 'w', 'w', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'y', 
		'y', 'y', 'y', 'y', 'y', 'y', 'y', 'y', 'y', 'y', 'y', 'y', 'y', 'y', 'y', 'y', 
		'y', 'y', 'y', 'y', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', '{', '|', '}', '~', 
		127
	};
		
	private static final byte[] ATSC_C4_SYMBOL = {
		27, '$', '2', '4', '7', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 
		'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'Y', 'Z', 27, 27, 
		27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 
		27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, '&', '\'', 
		'-', '1', '2', '3', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 
		'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 
		'b', 'c', 'd', 'e', 'f', 'i', 'l', 'o', 't', 0, 27, ' ', 27, 27, 27, '1', 
		27, 27, ' ', 27, ' ', '9', 'd', 's', 't', 27, 27, 27, 'A', 'H', 'S', 27, 
		27, ' ', 27, ' ', '-', '1', 'A', 'M', 'R', 'S', 'T', 'U', 0, 27, ' ', '.', 
		'I', 'S', 'W', 27, 0, 27, ' ', '-', '0', 0, 27, ' ', '0', '1', '2', '9', 
		0, 27, '0', '1', ':', 0, 27, '0', 27, '8', 27, 27, 27, '0', 27, ' ', 
		27, '0', '1', '3', '9', 27, ' ', 27, 27, 27, 27, 0, 27, 27, 27, ' ', 
		'*', '-', '.', 'B', 'b', 'c', 'd', 'f', 'g', 'i', 'l', 'm', 'n', 'p', 'r', 's', 
		't', 'u', 'v', 'w', 27, 'A', 'C', 'S', 'a', 'e', 'i', 'l', 'o', 'r', 'u', 27, 
		' ', 'A', 'B', 'O', 'a', 'e', 'h', 'i', 'l', 'o', 'r', 'u', 'y', 27, 'a', 'e', 
		'i', 'o', 'r', 'u', 'y', 27, 'C', 'a', 'd', 'l', 'm', 'n', 'q', 's', 'u', 'v', 
		'x', 'y', 27, ' ', 'L', 'a', 'e', 'i', 'l', 'o', 'r', 'u', 27, '.', 'A', 'a', 
		'e', 'h', 'i', 'l', 'o', 'r', 'u', 'y', 0, 27, 'a', 'e', 'i', 'o', 'u', 0, 
		27, ' ', '.', ':', 'I', 'T', 'c', 'm', 'n', 'r', 's', 't', 27, 'a', 'e', 'o', 
		'u', 27, 'a', 'e', 'i', 'n', 'o', 'u', 27, ' ', 'a', 'e', 'i', 'o', 'u', 27, 
		'*', 'T', 'a', 'c', 'e', 'i', 'o', 'r', 'u', 'y', 27, ' ', 'B', 'F', 'N', 'a', 
		'e', 'i', 'o', 'u', 27, ' ', 'd', 'f', 'l', 'n', 'p', 'r', 's', 'u', 'v', 'w', 
		27, ' ', '.', 'G', 'R', 'a', 'e', 'i', 'l', 'o', 'r', 's', 'u', 'y', 27, 'V', 
		'u', 27, 'a', 'e', 'h', 'i', 'o', 'u', 27, ' ', '*', '.', 'a', 'c', 'e', 'h', 
		'i', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 't', 'u', 'w', 27, '-', 'N', 'V', 'a', 
		'e', 'h', 'i', 'o', 'r', 'u', 'w', 27, '.', 'l', 'n', 'p', 0, 27, ' ', 'C', 
		'a', 'e', 'i', 'o', 27, 'F', 'W', 'a', 'e', 'h', 'i', 'o', 'r', 27, 27, 'a', 
		'e', 'o', 27, 'a', 'o', 27, 27, 27, 27, 27, 27, 0, 27, ' ', '\'', ':', 
		'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'p', 'r', 's', 
		't', 'u', 'v', 'w', 'x', 'y', 'z', 0, 27, ' ', 'a', 'b', 'e', 'i', 'l', 'o', 
		'r', 's', 'u', 'y', 0, 27, ' ', 'C', 'G', 'L', 'a', 'c', 'e', 'h', 'i', 'k', 
		'l', 'o', 'r', 's', 't', 'u', 'y', 0, 27, ' ', '.', 'a', 'd', 'e', 'g', 'i', 
		'l', 'o', 'r', 's', 'u', 'v', 'w', 'y', 0, 27, ' ', '!', '\'', '-', ':', 'a', 
		'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 
		'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 0, 27, ' ', 'a', 'e', 'f', 'i', 
		'l', 'o', 'r', 's', 't', 'u', 0, 27, ' ', '\'', ':', 'a', 'e', 'g', 'h', 'i', 
		'l', 'n', 'o', 'r', 's', 't', 'u', 'y', 0, 27, ' ', 'a', 'b', 'e', 'i', 'l', 
		'n', 'o', 'r', 't', 'u', 'w', 'y', 0, 27, ' ', '!', 'a', 'b', 'c', 'd', 'e', 
		'f', 'g', 'i', 'k', 'l', 'm', 'n', 'o', 'p', 'r', 's', 't', 'v', 'x', 'z', 27, 
		'a', 'o', 0, 27, ' ', ':', 'T', 'a', 'e', 'f', 'i', 'l', 'o', 's', 'w', 'y', 
		0, 27, ' ', '\'', '-', ':', 'a', 'b', 'c', 'd', 'e', 'f', 'i', 'k', 'l', 'm', 
		'o', 'r', 's', 't', 'u', 'v', 'w', 'y', 0, 27, ' ', 'a', 'b', 'e', 'i', 'm', 
		'o', 'p', 's', 'u', 'y', 0, 27, ' ', '\'', ':', 'a', 'b', 'c', 'd', 'e', 'f', 
		'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'r', 's', 't', 'u', 'v', 'y', 'z', 
		0, 27, ' ', '\'', '.', '?', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'k', 
		'l', 'm', 'n', 'o', 'p', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 0, 27, 
		' ', '\'', 'a', 'd', 'e', 'h', 'i', 'l', 'm', 'o', 'p', 'r', 's', 't', 'y', 27, 
		'u', 0, 27, ' ', '\'', ',', '.', ':', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'i', 
		'k', 'l', 'm', 'n', 'o', 'p', 'r', 's', 't', 'u', 'v', 'y', 0, 27, ' ', '\'', 
		',', '.', ':', '?', 'C', 'H', 'a', 'c', 'd', 'e', 'f', 'h', 'i', 'k', 'l', 'm', 
		'n', 'o', 'p', 'r', 's', 't', 'u', 'y', 0, 27, ' ', '\'', ':', '?', 'a', 'b', 
		'c', 'd', 'e', 'h', 'i', 'l', 'm', 'n', 'o', 'r', 's', 't', 'u', 'w', 'y', 0, 
		27, ' ', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'i', 'k', 'l', 'm', 'n', 'p', 'r', 
		's', 't', 'z', 27, 'a', 'e', 'i', 'o', 's', 0, 27, ' ', '\'', 'a', 'b', 'c', 
		'e', 'i', 'l', 'n', 'o', 'r', 's', 0, 27, ' ', 'a', 'e', 'i', 'p', 't', 0, 
		27, ' ', '!', '\'', '-', 'a', 'b', 'c', 'd', 'e', 'i', 'l', 'm', 'n', 'o', 'p', 
		's', 't', 'v', 'w', 0, 27, ' ', 'a', 'e', 'i', 'y', 'z', 27, 27, 27, 27, 
		27
	};
	
	private static final String ATSC_C4_CODE[] = {
		"11001011", "1100101011", "011010010", "1100101010", "011010011", "0111", "1001", "1011", "11011", "10001", "11000", "11100", "11111", "10000", "01100", "1100110", 
		"11101", "1010", "0011", "011011", "11110", "01101000", "11010", "000", "010", "0110101", "1100111", "0010", "1100100", "110010100", "1", "1", 
		"1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", 
		"1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "10010100", "010001", "010000100", 
		"00000001", "010000101", "00000010", "01000001", "000000000", "10111", "0010", "1100", "11100", "011010", "10011", "00001", "10101", "111111", "111110", "010011", 
		"11110", "0101", "10110", "011011", "11101", "100100011", "10100", "1101", "1000", "1001001", "1001011", "0011", "0000000010", "000001", "00000011", "01100", 
		"10010101", "01000000", "01000011", "0000000011", "10010000", "010010", "100100010", "0001", "0111", "1", "01", "00", "1", "1", "1", "0", 
		"1", "0", "1", "011", "010", "0001", "0000", "1", "001", "1", "1", "00", "01", "10", "11", "1", 
		"0", "1", "01", "111", "1101", "1000", "001", "000", "1001", "1010", "1011", "1100", "111", "101", "0", "110", 
		"10010", "1000", "10011", "1", "01", "001", "10", "000", "11", "010", "011", "110", "111", "100", "101", "00", 
		"11", "10", "01", "000", "001", "0", "11", "10", "0", "1", "1", "1", "0", "1", "0", "1", 
		"11", "01", "100", "101", "00", "0", "1", "1", "1", "1", "1", "1", "0", "1", "00010", "010", 
		"1101000", "1101001", "1101010", "110110", "110010", "01100", "001", "01101", "011110", "110011", "100", "111", "101", "110111", "0000", "00011", 
		"011111", "11000", "1101011", "01110", "00010", "000110", "0000", "000111", "111", "01", "1010", "1011", "110", "001", "100", "00101", 
		"10110", "0011100", "001111", "101110", "100", "101111", "01", "00110", "000", "11", "1010", "00100", "0011101", "01001", "10", "111", 
		"110", "00", "011", "0101", "01000", "011", "1010", "111", "000", "1100", "0100", "1101", "101110", "10110", "101111", "100", 
		"001", "0101", "011111", "011110", "01110", "10", "0110", "110", "000", "010", "111", "001", "10110", "101010", "101111", "1110", 
		"110", "10100", "100", "101011", "01", "00", "1111", "101110", "111010", "111011", "110", "10", "1111", "0", "11100", "1000", 
		"1001", "11110", "111110", "101110", "1100", "101111", "10110", "1010", "0", "111111", "1101", "1110", "000", "01", "11", "10", 
		"001", "000", "0100", "001", "1", "0111", "0101", "0110", "01001", "01000", "10", "011", "11", "00", "0101", "1011111", 
		"10111100", "10111101", "11", "101110", "1010", "100", "00", "10110", "010", "011", "1000", "110001", "1001", "110010", "110000", "1101", 
		"0", "111", "101", "110011", "010", "001", "01110", "11010", "1100", "10", "0001", "0110", "01111", "111", "11011", "0000", 
		"111111", "1111100", "011001", "111101", "111100", "00", "010", "0111", "1110", "110", "10", "1111101", "01101", "011000", "00", "01", 
		"1", "10001", "101", "11", "10000", "00", "01", "1001", "101110", "1110100", "1011000", "1011011", "1111", "11100", "000", "100", 
		"1100", "101111", "1011001", "1110110", "1110111", "1010", "001", "1011010", "01", "1101", "1110101", "1111010", "11110110", "11110111", "111100", "1010", 
		"1011", "0", "1110", "110", "100", "111110", "111111", "101", "1001", "1000", "0", "11", "000", "0011", "01010", "01011", 
		"011", "0100", "1", "0010", "00011", "000100", "000101", "111", "110", "001", "01", "10", "0000", "1", "001", "000", 
		"01", "1", "00", "01", "1", "1", "1", "1", "1", "1", "1", "00010", "1111010110", "10110", "11110100", "1111010111", 
		"010010", "11111", "10100", "101011000", "10101101", "01000", "0100111", "10111", "101011001", "101010", "001", "0101", "110", "111100", "100", "1110", 
		"011", "1111011", "00011", "1010111", "111101010", "0000", "0100110", "11111", "111101", "0110", "00", "01111", "1010", "1110", "010", "110", 
		"1011", "111100", "01110", "100", "010110", "1000011", "0100", "0010110", "1000010", "0010111", "011", "001010", "111", "101", "0011", "110", 
		"010111", "1001", "10001", "00100", "000", "01010", "100000", "011", "101110", "11", "101101110", "1010", "100000", "00", "100001", "1001", 
		"1011010", "101111", "101100", "0101", "101101111", "10001", "10110110", "0100", "001", "1010111100", "01", "1010111101", "10101100", "1010111110", "00010010", "1000", 
		"10101101", "100111", "00011", "10100", "1001100", "1010100", "1010111111", "10101110", "000100000", "1010101", "10010", "1001101", "1110", "000101", "000001", "000100001", 
		"110", "1111", "10110", "000100010", "000000", "10111", "00010011", "00001", "000100011", "11100", "1111001", "0", "11101", "110", "1011", "1001", 
		"111101", "1010", "111111", "111110", "1000", "1111000", "110", "1110000", "01", "1001100", "11100010", "1000", "101", "1111010", "00", "11101", 
		"1111011", "100111", "111001", "10010", "11111", "1001101", "111100", "11100011", "11101", "1110001", "1011", "1100", "11100110", "0", "100", "1110010", 
		"101001", "1101", "10101", "1111", "11100111", "1110000", "101000", "00110101", "00110110", "000100", "001101000", "00011", "0011000", "1111", "0010", "1101", 
		"00111", "1100", "00110010", "00110011", "0110", "11101", "10", "0100", "000101", "11100", "0111", "0101", "0000", "001101001", "00110111", "10", 
		"11", "0", "01", "00011", "111", "00001", "000000", "001111", "10", "000100", "110", "000101", "000001", "0010", "001110", "00110", 
		"1000", "0111001", "010", "01100010", "11110011", "01100011", "1110", "0110000", "01110000", "000", "110", "1111000", "001", "011001", "101", "1111010", 
		"11111", "11110010", "01101", "011101", "01111", "1111011", "01110001", "1001", "0100", "010101", "001", "101", "0000", "11", "011", "0001", 
		"1001", "1000", "010111", "010110", "010100", "000", "01110011", "110", "011101", "1001010", "11100", "111010000", "01111", "001", "010", "1001011", 
		"101", "111010101", "1000", "111010001", "1110110", "111010110", "111010111", "10011", "1110111", "111010100", "0110", "1111", "11101001", "0111000", "100100", "01110010", 
		"00101", "01110001", "0101", "01110000", "0111011010", "011101100", "1100010", "001001", "110000", "01111", "0111001", "1001", "00010", "0111010", "01110111", "1100011", 
		"0100", "1000", "111", "0011", "01101", "101", "11001", "00011", "1101", "01100", "0000", "0010000", "0010001", "0111011011", "1101", "101110", 
		"010", "1100101", "1001", "101111", "111", "11000", "1010", "0110", "1100100", "00", "0111", "10001", "10000", "10110", "110011", "0", 
		"1", "1001", "01100101", "1111", "0110011", "110011101", "0111100", "110011100", "000", "01111101", "0111111", "11000", "101", "11001111", "0111101", "010", 
		"110010", "0011", "011000", "01101", "1101", "01111100", "01110", "1110", "1000", "1100110", "01100100", "0010", "11", "0010011", "01", "001011010", 
		"001011011", "00100101", "0000001", "001011100", "001011101", "001011110", "101010", "101011", "001011111", "1011", "00000000", "00001", "0011", "000001", "00101010", "00000001", 
		"00101011", "10100", "001000", "00100100", "0001", "100", "0010100", "00101100", "010", "11000010", "101", "11000011", "110110000", "110110001", "0000", "100000", 
		"1101101", "11000000", "011", "111", "001", "10001", "100001", "11011001", "1001", "11010", "0001", "110111", "11001", "11000001", "110001", "0011110", 
		"000100", "001110", "00110", "10011", "11100", "10000", "0010", "0011111", "11101", "00011", "0001010", "0000", "10010", "110", "10001", "01", 
		"101", "1111", "0001011", "0010", "000", "1", "01", "00111", "00110", "001", "01010", "011", "010010", "000", "010011", "010111", 
		"1111", "1100", "010110", "1110", "1101", "01000", "10", "110", "1010", "1011", "000", "001", "100", "111", "01", "10", 
		"111110", "0", "1101101", "110101", "11110101", "1101110", "1111011", "11110100", "1100000", "11001", "1100001", "111111", "1101111", "1100010", "1100011", "1101000", 
		"1110", "1101001", "1101100", "111100", "110", "100", "000", "01", "1010", "111", "001", "1011", "1", "1", "1", "1", 
		"1"
	};

	private static final byte ATSC_C6_PRIOR[] = {
		0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
		0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 
		10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 
		26, 27, 28, 29, 30, 31, ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', 
		' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', 
		' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', 
		' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', 
		' ', '!', '\"', '\"', '\"', '\"', '\"', '\"', '#', '$', '%', '&', '\'', '\'', '\'', '\'', 
		'(', ')', ')', '*', '+', ',', ',', ',', '-', '-', '-', '-', '-', '-', '-', '-', 
		'-', '-', '.', '.', '.', '.', '.', '.', '/', '/', '0', '0', '0', '0', '0', '0', 
		'1', '1', '1', '1', '2', '2', '2', '2', '3', '3', '3', '4', '4', '4', '5', '5', 
		'5', '6', '7', '7', '7', '8', '9', '9', '9', '9', '9', ':', ':', ';', ';', '<', 
		'=', '>', '?', '?', '@', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 
		'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 
		'C', 'D', 'D', 'D', 'D', 'D', 'D', 'D', 'D', 'E', 'E', 'E', 'E', 'E', 'E', 'E', 
		'E', 'E', 'F', 'F', 'F', 'F', 'F', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'H', 
		'H', 'H', 'H', 'H', 'H', 'I', 'I', 'I', 'I', 'I', 'I', 'I', 'J', 'J', 'J', 'J', 
		'J', 'J', 'J', 'K', 'K', 'K', 'K', 'K', 'L', 'L', 'L', 'L', 'L', 'L', 'M', 'M', 
		'M', 'M', 'M', 'M', 'M', 'N', 'N', 'N', 'N', 'N', 'O', 'O', 'O', 'O', 'O', 'O', 
		'P', 'P', 'P', 'P', 'P', 'P', 'P', 'P', 'Q', 'R', 'R', 'R', 'R', 'R', 'R', 'S', 
		'S', 'S', 'S', 'S', 'S', 'S', 'S', 'S', 'S', 'S', 'S', 'T', 'T', 'T', 'T', 'T', 
		'T', 'T', 'T', 'T', 'U', 'U', 'U', 'V', 'V', 'V', 'V', 'W', 'W', 'W', 'W', 'W', 
		'W', 'X', 'Y', 'Y', 'Z', '[', '\\', ']', '^', '_', '`', 'a', 'a', 'a', 'a', 'a', 
		'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 
		'a', 'a', 'a', 'a', 'a', 'a', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 
		'b', 'b', 'b', 'b', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 
		'c', 'c', 'c', 'c', 'c', 'c', 'd', 'd', 'd', 'd', 'd', 'd', 'd', 'd', 'd', 'd', 
		'd', 'd', 'd', 'd', 'd', 'd', 'd', 'd', 'd', 'd', 'd', 'd', 'e', 'e', 'e', 'e', 
		'e', 'e', 'e', 'e', 'e', 'e', 'e', 'e', 'e', 'e', 'e', 'e', 'e', 'e', 'e', 'e', 
		'e', 'e', 'e', 'e', 'e', 'e', 'e', 'e', 'e', 'e', 'e', 'e', 'f', 'f', 'f', 'f', 
		'f', 'f', 'f', 'f', 'f', 'f', 'f', 'f', 'g', 'g', 'g', 'g', 'g', 'g', 'g', 'g', 
		'g', 'g', 'g', 'g', 'g', 'g', 'g', 'g', 'g', 'h', 'h', 'h', 'h', 'h', 'h', 'h', 
		'h', 'h', 'h', 'h', 'h', 'h', 'h', 'h', 'h', 'i', 'i', 'i', 'i', 'i', 'i', 'i', 
		'i', 'i', 'i', 'i', 'i', 'i', 'i', 'i', 'i', 'i', 'i', 'i', 'i', 'i', 'i', 'i', 
		'j', 'j', 'j', 'j', 'j', 'k', 'k', 'k', 'k', 'k', 'k', 'k', 'k', 'k', 'k', 'k', 
		'l', 'l', 'l', 'l', 'l', 'l', 'l', 'l', 'l', 'l', 'l', 'l', 'l', 'l', 'l', 'l', 
		'l', 'l', 'l', 'l', 'l', 'l', 'l', 'l', 'l', 'm', 'm', 'm', 'm', 'm', 'm', 'm', 
		'm', 'm', 'm', 'm', 'm', 'm', 'm', 'm', 'n', 'n', 'n', 'n', 'n', 'n', 'n', 'n', 
		'n', 'n', 'n', 'n', 'n', 'n', 'n', 'n', 'n', 'n', 'n', 'n', 'n', 'n', 'n', 'n', 
		'n', 'n', 'n', 'n', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 
		'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 
		'o', 'p', 'p', 'p', 'p', 'p', 'p', 'p', 'p', 'p', 'p', 'p', 'p', 'p', 'p', 'p', 
		'p', 'p', 'q', 'q', 'r', 'r', 'r', 'r', 'r', 'r', 'r', 'r', 'r', 'r', 'r', 'r', 
		'r', 'r', 'r', 'r', 'r', 'r', 'r', 'r', 'r', 'r', 'r', 'r', 'r', 'r', 'r', 'r', 
		's', 's', 's', 's', 's', 's', 's', 's', 's', 's', 's', 's', 's', 's', 's', 's', 
		's', 's', 's', 's', 's', 's', 's', 's', 't', 't', 't', 't', 't', 't', 't', 't', 
		't', 't', 't', 't', 't', 't', 't', 't', 't', 't', 't', 't', 't', 't', 't', 'u', 
		'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 
		'u', 'u', 'u', 'v', 'v', 'v', 'v', 'v', 'v', 'v', 'w', 'w', 'w', 'w', 'w', 'w', 
		'w', 'w', 'w', 'w', 'w', 'w', 'w', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'y', 
		'y', 'y', 'y', 'y', 'y', 'y', 'y', 'y', 'y', 'y', 'y', 'y', 'y', 'y', 'y', 'y', 
		'y', 'y', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', '{', '|', '}', '~', 127
	};
	
	private static final byte ATSC_C6_SYMBOL[] = {
		27, '"', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 
		'O', 'P', 'R', 'S', 'T', 'V', 'W', 27, 27, 27, 27, 27, 27, 27, 27, 27, 
		27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 
		27, 27, 27, 27, 27, 27, 27, '"', '(', '-', '/', '1', '2', '3', '4', '5', 
		'7', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 
		'P', 'R', 'S', 'T', 'U', 'V', 'W', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 
		'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 
		'y', 27, 0, 27, ' ', '.', 'H', 'T', 27, 27, 27, 27, 27, ' ', 's', 't', 
		27, 27, ',', 27, 27, 27, ' ', '"', 27, ' ', 'a', 'b', 'c', 'd', 'e', 'f', 
		'r', 's', 0, 27, ' ', '"', 'J', 'S', 27, ' ', 27, ' ', '0', '7', 's', 't', 
		27, ' ', '8', '9', 27, ' ', '.', '6', 27, ' ', '0', 27, ' ', '.', 27, ' ', 
		'.', 27, 27, ',', '.', 27, 27, ' ', '5', '6', '8', 27, ' ', 27, ' ', 27, 
		27, 27, 27, ' ', 27, 27, ' ', 'd', 'f', 'l', 'm', 'n', 'r', 's', 't', 'u', 
		27, 'a', 'e', 'i', 'l', 'o', 'r', 'u', 27, 'a', 'h', 'i', 'l', 'o', 'r', 'u', 
		'y', 27, 'a', 'e', 'i', 'o', 'r', 'u', 'y', 27, 'a', 'd', 'i', 'l', 'n', 'r', 
		's', 'v', 27, 'e', 'l', 'o', 'r', 27, 'a', 'e', 'i', 'l', 'o', 'r', 'u', 27, 
		'a', 'e', 'i', 'o', 'u', 27, ' ', '.', 'I', 'n', 'r', 's', 27, '.', 'a', 'e', 
		'i', 'o', 'u', 27, 'a', 'e', 'i', 'r', 27, 'a', 'e', 'i', 'o', 'u', 27, 'a', 
		'c', 'e', 'i', 'o', 'u', 27, 'a', 'e', 'i', 'o', 27, '\'', 'l', 'n', 'r', 's', 
		27, 'a', 'e', 'h', 'i', 'l', 'o', 'r', 27, 27, '.', 'a', 'e', 'i', 'o', 27, 
		'.', 'a', 'c', 'e', 'h', 'i', 'o', 't', 'u', 'v', 'y', 27, 'V', 'a', 'e', 'h', 
		'i', 'o', 'r', 'w', 27, '.', 'n', 27, ' ', 'e', 'i', 27, 'a', 'e', 'h', 'i', 
		'o', 27, 27, 'o', 27, 27, 27, 27, 27, 27, 27, 27, ' ', '\'', '.', 'b', 
		'c', 'd', 'e', 'f', 'g', 'h', 'i', 'k', 'l', 'm', 'n', 'o', 'p', 'r', 's', 't', 
		'u', 'v', 'w', 'x', 'y', 'z', 27, ' ', '.', 'a', 'b', 'd', 'e', 'i', 'l', 'o', 
		'r', 's', 'u', 'y', 27, ' ', ',', '.', 'D', 'a', 'c', 'e', 'h', 'i', 'k', 'l', 
		'o', 'q', 'r', 't', 'u', 'y', 27, ' ', '\'', ',', '.', ';', 'a', 'd', 'e', 'f', 
		'g', 'i', 'l', 'm', 'n', 'o', 'r', 's', 'u', 'v', 'w', 'y', 27, ' ', '\'', ')', 
		',', '-', '.', ';', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'k', 'l', 'm', 
		'n', 'o', 'p', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 27, ' ', '.', 'a', 
		'e', 'f', 'i', 'l', 'o', 'r', 't', 'u', 27, ' ', '\'', ',', '-', '.', 'a', 'e', 
		'g', 'h', 'i', 'l', 'o', 'r', 's', 'u', 'y', 27, ' ', '\'', ',', '-', '.', 'a', 
		'e', 'i', 'n', 'o', 'r', 's', 't', 'u', 'y', 27, ' ', ',', '.', 'a', 'b', 'c', 
		'd', 'e', 'f', 'g', 'k', 'l', 'm', 'n', 'o', 'p', 'r', 's', 't', 'v', 'x', 'z', 
		27, 'a', 'e', 'o', 'u', 27, ' ', '\'', ',', '.', 'e', 'i', 'l', 'n', 's', 'y', 
		27, ' ', '\'', ',', '-', '.', 'a', 'b', 'c', 'd', 'e', 'f', 'i', 'k', 'l', 'm', 
		'n', 'o', 'p', 'r', 's', 't', 'u', 'v', 'y', 27, ' ', '\'', '.', ';', 'a', 'b', 
		'e', 'i', 'm', 'o', 'p', 's', 'u', 'y', 27, ' ', '\'', ',', '-', '.', ';', 'a', 
		'b', 'c', 'd', 'e', 'f', 'g', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'r', 's', 't', 
		'u', 'v', 'y', 'z', 27, ' ', ',', '-', '.', 'B', 'a', 'b', 'c', 'd', 'e', 'f', 
		'g', 'h', 'i', 'k', 'l', 'm', 'n', 'o', 'p', 'r', 's', 't', 'u', 'v', 'w', 'x', 
		'y', 27, ' ', '-', '.', 'a', 'e', 'h', 'i', 'l', 'm', 'o', 'p', 'r', 's', 't', 
		'u', 'y', 27, 'u', 27, ' ', '\'', ')', ',', '-', '.', ';', 'a', 'b', 'c', 'd', 
		'e', 'f', 'g', 'i', 'k', 'l', 'm', 'n', 'o', 'p', 'r', 's', 't', 'u', 'v', 'y', 
		27, ' ', '"', '\'', ',', '.', ';', 'a', 'b', 'c', 'e', 'h', 'i', 'k', 'l', 'm', 
		'n', 'o', 'p', 's', 't', 'u', 'w', 'y', 27, ' ', '\'', ',', '-', '.', ';', 'a', 
		'b', 'c', 'e', 'h', 'i', 'l', 'm', 'n', 'o', 'r', 's', 't', 'u', 'w', 'y', 27, 
		' ', 'a', 'b', 'c', 'd', 'e', 'g', 'i', 'k', 'l', 'm', 'n', 'o', 'p', 'r', 's', 
		't', 'v', 'y', 27, 'a', 'e', 'i', 'o', 's', 'y', 27, ' ', '.', 'a', 'e', 'h', 
		'i', 'l', 'm', 'n', 'o', 'r', 's', 27, ' ', ',', '-', 'a', 'e', 'i', 't', 27, 
		' ', '\'', ',', '.', ';', '?', 'a', 'b', 'd', 'e', 'f', 'i', 'l', 'm', 'n', 'o', 
		's', 'w', 27, ' ', '.', 'a', 'e', 'i', 'l', 'o', 'z', 27, 27, 27, 27, 27
	};
	
	private static final String ATSC_C6_CODE[] = {
		"1110000", "111001", "010", "0011", "0111", "11101", "10010", "10110", "011011", "10111", "011000", "1100", "00101", "10011", "1111", "00100", 
		"011001", "000", "1000", "1010", "1101", "1110001", "011010", "1", "1", "1", "1", "1", "1", "1", "1", "1", 
		"1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", 
		"1", "1", "1", "1", "1", "1", "101000001", "111111010", "1111111100", "11111111110", "11111111111", "0101011", "0100010", "1111111101", "110010100", "1111111110", 
		"1010000000", "10010", "010100", "111100", "1111010", "0100011", "0101010", "000010", "1111011", "11001011", "000011", "1100100", "010110", "101001", "001100", "10100001", 
		"001101", "1111100", "01001", "1100110", "111111011", "111111100", "010000", "111111101", "1010000001", "011", "10111", "10011", "10000", "100010", "11101", "100011", 
		"0001", "10101", "11001111", "11111010", "010111", "00000", "1010001", "0010", "10110", "110010101", "00111", "11100", "1101", "11111011", "11111100", "11000", 
		"11001110", "1", "000", "10", "11", "001", "010", "011", "1", "1", "1", "1", "00", "010", "1", "011", 
		"1", "1", "0", "1", "1", "00", "1", "01", "10", "1110", "000", "0010", "110", "0011", "0100", "0101", 
		"1111", "011", "1", "000", "01", "0010", "00110", "00111", "0", "1", "100", "111", "00", "101", "01", "110", 
		"111", "10", "110", "0", "101", "11", "0", "100", "10", "0", "11", "10", "11", "0", "11", "10", 
		"0", "1", "0", "10", "11", "1", "110", "111", "00", "01", "10", "0", "1", "0", "1", "1", 
		"1", "1", "0", "1", "1", "10010", "11", "10011", "101000", "00", "10101", "01", "1011", "10000", "10001", "101001", 
		"10010", "101", "111", "00", "10011", "110", "01", "1000", "01110", "00", "10", "01111", "110", "111", "0101", "0110", 
		"0100", "1111", "01", "100", "00", "101", "1101", "1110", "1100", "10", "0110", "000", "0111", "001", "1100", "111", 
		"010", "1101", "00", "100", "101", "01", "11", "000", "110", "01", "100", "001", "1011", "111", "1010", "010", 
		"00", "011", "110", "10", "111", "011", "000", "100", "001", "11", "101", "010", "1000", "1001", "111", "1101", 
		"1100", "0", "101", "111", "100", "0", "101", "110", "0110", "11", "00", "0111", "10", "010", "11010", "0", 
		"11011", "1111", "10", "1100", "1110", "1100", "111", "0", "1101", "10", "10", "010", "110", "011", "111", "00", 
		"10010", "0", "111", "10011", "1000", "1101", "101", "1100", "1", "0000", "0001", "01", "10", "001", "11", "1011", 
		"0001", "100", "0010", "1110", "110", "0011", "1111", "01", "1010", "00000", "00001", "1010", "1000", "1001", "11010", "0", 
		"1011", "111", "1100", "11011", "10", "0", "11", "111", "10", "110", "0", "010", "111", "110", "011", "10", 
		"00", "1", "0", "1", "1", "1", "1", "1", "1", "1", "1", "111001101", "101", "111001110", "1110010", "001011", 
		"11001", "00111", "0011001", "001010", "00100", "001100010", "111000", "110000", "1101", "11101", "01", "001100011", "00000", "100", "0001", "1111", 
		"110001", "001101", "111001111", "111001100", "00001", "00110000", "101000", "0101", "101001", "100", "101010", "1010110", "00", "1011", "0100", "110", 
		"1110", "1010111", "1111", "011", "00010", "10000", "010000", "0100011", "0100110", "110", "010010", "011", "111", "0101", "1001", "10001", 
		"101", "0100010", "00011", "001", "0000", "0100111", "1010001", "11", "01111010", "101011", "0100", "01111011", "1000", "01010", "00", "10100000", 
		"10101011", "1011", "011111", "10100001", "1010100", "0110", "01110", "1001", "101001", "0111100", "10101010", "01011", "101110011", "111", "10111010", "100110000", 
		"000111", "10011001", "00110", "10011010", "1000", "0001100", "10010", "0000", "10100", "10111011", "0001101", "100110001", "000100", "10011011", "0010", "100111", 
		"010", "001110", "001111", "110", "011", "10101", "101110010", "101100", "101111", "000101", "101101", "10111000", "1110111", "10", "1110110", "1111", 
		"000", "0101", "001", "111010", "110", "011", "0100", "11100", "1111010", "10", "1111011", "111110", "0101010", "01011", "1110", "00", 
		"0101011", "011", "1101", "111100", "0100", "111111", "11000", "11001", "010100", "1011100", "100", "10101000", "10101001", "10101011", "101001", "011", 
		"11", "00", "101011", "010", "101111", "10101010", "10110", "101000", "1011101", "00011101", "0001111", "100110100", "10011000", "11010", "100110101", "1111", 
		"10000", "1110", "100111", "10010", "10011011", "1100", "10001", "01", "11011", "000110", "0000", "101", "001", "00010", "00011100", "10011001", 
		"000", "001", "010", "1", "011", "0000", "01", "10000", "10011", "0001", "11", "101", "100100", "10001", "001", "100101", 
		"0011100", "110", "00111100", "001101", "00111101", "00100", "000", "0011101", "00111111", "10111", "111", "010110", "011", "10110110", "100", "010111", 
		"00111110", "1010", "00101", "10110111", "01010", "001100", "1011010", "101100", "0100", "101010", "111", "1010110", "110101", "1010111", "00", "10100", 
		"01", "1100", "10110", "1000", "1001", "10111", "11011", "110100", "0100000", "10", "0100011", "111100", "011011010", "01100", "011011011", "11111", 
		"011011100", "01001", "110", "001", "01000101", "000", "01111", "011011101", "1111010", "01101100", "011011110", "01110", "1111011", "011011111", "0101", "1110", 
		"0100001", "0110100", "0110101", "01000100", "101010011", "001", "01001111", "01001110", "0100110", "101010010", "100001", "110111", "100000", "110101", "1010101", "000", 
		"1101000", "1101001", "1101101", "010010", "0101", "1100", "111", "10100", "01000", "011", "10001", "10010", "1011", "101011", "10011", "10101000", 
		"1101100", "011011", "000", "1010010", "101000", "001", "110", "1111", "1011", "010", "1010011", "0111", "11101", "100", "01100", "11100", 
		"10101", "011010", "0", "1", "10011111", "111", "1001110", "100111100", "100100", "11001100", "10001", "100111101", "1101", "11001101", "100001", "11000", 
		"101", "110011111", "100101", "010", "110010", "00100", "00101", "01100", "000", "11001110", "100110", "0111", "0011", "100000", "110011110", "01101", 
		"10011100", "0", "100111100", "100111101", "111011", "1000", "11101011", "110011", "100111110", "10010", "1101", "11000", "11100", "100111111", "1110100", "111010100", 
		"111010101", "11110", "1001101", "11111", "101", "110010", "10011101", "1001100", "11000011", "111", "11000100", "0111100", "01111110", "01101", "110000100", "0100", 
		"110000101", "11000101", "101", "00", "1101", "0111101", "01111111", "0111110", "100", "11001", "0101", "01100", "01110", "1100000", "1100011", "1001100", 
		"100000", "100111", "100001", "10001", "11100", "11101", "11110", "10010", "1001101", "0100", "111111", "110", "11111010", "0101", "00", "011", 
		"101", "11111011", "1111100", "00010", "001", "1", "01", "0000", "000110", "000111", "011101", "001", "011100", "010", "1110", "000", 
		"10", "011110", "011111", "11111", "110", "0110", "11110", "10", "0110", "0111", "1100", "111", "00", "010", "1101", "01010", 
		"1", "010010", "0001", "0111", "011001", "0100110", "0100111", "0110000", "000001", "0010", "0110001", "000010", "01000", "000000", "01011", "01101", 
		"0011", "000011", "100", "1110", "1111", "000", "001", "110", "010", "101", "011", "1", "1", "1", "1", "1"
	};
}
